#include <iostream>
#include <unistd.h>
#include <fcntl.h>

void SetNonBlock(int sockfd)
{

    // 文件描述符fd  操作类型  具体参数（根据操作类型不同来确定不同参数）
    int flags = fcntl(sockfd, F_GETFL, 0);
    if (flags < 0)
    {
        perror("fcntl");
        return;
    }
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
}


//非阻塞读取打印，获得不同的结果
int main()
{
    SetNonBlock(0);
    std::string tip="Please Enter:";
    char buffer[1024];
    while(true)
    {
        write(1,tip.c_str(),tip.size());
        int n=read(0,buffer,sizeof(buffer)-1);

        if(n>0)
        {
            buffer[n]=0;
            std::cout<<"读取的内容为:"<<buffer<<std::endl;
        }
        else if(n==0)
        {
            std::cout<<"写端关闭，停止读取"<<std::endl;
            break;
        }
        else
        {
            //常见的三种情况 1.读取正确但规定时间无结果  2.程序中断  3.读取错误
            if (errno == EAGAIN || errno == EWOULDBLOCK)
            {
                std::cout << "底层数据，没有就绪" << std::endl;
                sleep(1);
                continue;
            }
            else if (errno == EINTR)
            {
                std::cout << "读取被中断,从新来" << std::endl;
                sleep(1);
                continue;
            }
            else
            {
                std::cout << "read error: " << n << ", errno: " << errno << std::endl;
                break;
            }
        }
    }

    return 0;
}